#include "Return.hpp"
#include "Module.hpp"
#include <lua.hpp>

namespace lua
{

Return::Return(int numReturnValues) : 
	mModule(Module::currentModule),
	mNumReturnValues(numReturnValues)
{
	
}

Return::Return(const Return &args)
{ 
	mNumReturnValues = args.mNumReturnValues; 
	mModule = args.mModule; 
}

void Return::operator=(const Return &args)
{ 
	mNumReturnValues = args.mNumReturnValues;
	mModule = args.mModule; 
}

Module* Return::getModule()
{
	return mModule; 
}

void Return::insert(int value)
{
	lua_pushnumber(mModule->getLuaVM(), value);
	++mNumReturnValues;
}

void Return::insert(const char *value)
{
	lua_pushstring(mModule->getLuaVM(), value);
	++mNumReturnValues;
}

void Return::insert(bool value)
{
	lua_pushboolean(mModule->getLuaVM(), value);
	++mNumReturnValues;
}

void Return::insert(void *userdata)
{
	lua_pushlightuserdata(mModule->getLuaVM(), userdata);
	++mNumReturnValues;
}

const Return& Return::operator<<(int value)
{
	lua_pushnumber(mModule->getLuaVM(), value);
	++mNumReturnValues;
	return *this;
}

const Return& Return::operator<<(const char *value)
{
	lua_pushstring(mModule->getLuaVM(), value);
	++mNumReturnValues;
	return *this;
}

const Return& Return::operator<<(bool value)
{
	lua_pushboolean(mModule->getLuaVM(), value);
	++mNumReturnValues;
	return *this;
}

const Return& Return::operator<<(void *userdata)
{
	lua_pushlightuserdata(mModule->getLuaVM(), userdata);
	++mNumReturnValues;
	return *this;
}

}